Loading up the data for some preliminary analyses of the binary
climb/no-climb categories.
Load data
You can see the indices I add in the code below. Note that the
indices are all caps, and the linear measurements have lowercase letters
after the first.
<<<<<<< HEAD
=======
>>>>>>> 6b17dabeddd9bc3ae49ba2fd4f1e42240a536368
dat <- read_sheet("https://docs.google.com/spreadsheets/d/1-eknhyZ1JNnXqhg2kViyzVntC8NGZvILQX-aQQb1Jvk/edit#gid=325036460", na = c("NA", "?", "")) %>%
select(!NOTES) %>%
# Recode Ordinal Rankings
mutate(Loc_Ord = case_when(Loc_mode_Ordinal == "G" ~ 1,
Loc_mode_Ordinal == "A" ~ 2,
Loc_mode_Ordinal == "Sc" ~ 3,
Loc_mode_Ordinal == "T" ~ 4,
Loc_mode_Ordinal == "Is" ~ 5,
Loc_mode_Ordinal == "Sf" ~ 5,
Loc_mode_Ordinal == "Ss" ~ 6,
TRUE ~ NA),
Loc_Ord = as.ordered(Loc_Ord),
Loc_bin = case_when(Loc_mode_Bindary == "Ground" ~ 0,
Loc_mode_Bindary == "Tree" ~ 1,
TRUE ~ NA
),
# Loc_bin = as.factor(Loc_bin),
Loc_mode_Categorical = as.factor(Loc_mode_Categorical),
log_Mass = log(Mass_grams)) %>%
relocate(Loc_bin, .after = Loc_mode_Bindary) %>%
relocate(Loc_Ord, .after = Loc_mode_Ordinal) %>%
relocate(log_Mass, .before = Skl) %>%
<<<<<<< HEAD
#################
#Calculate Indices!
#################
=======
#Calculate Ratios
>>>>>>> 6b17dabeddd9bc3ae49ba2fd4f1e42240a536368
mutate(SI = Sh / Sl, # Scapular Index
HRI = Hsw / Hl, # Humeral Robustness Index
HPI = Hpw / Hl, # Humeral Proximal Index
HEB = Hdw / Hl, # Humeral Epicondyle Breadth
HHRI = Hhl / Hl, # Humeral Head Robustness Index
HHW = Hhw / Hhl, # Humeral Head Shape Index
DI = Hdcw / Hsw, # Deltopectoral Crest Index
OLI = Uol / Ul, # Olecranon Process Length Index
BI = Rl / Hl, # Brachial Index
IM = (Hl+Ul)/(Fl+Tl), # Intermembral Index
PRTI = Mcl/(Hl+Rl), # Palm Robustness Index
MRI = Mcw / Mcl, # Metacarpal Robustness
MANUS = Ppl / Mcl, # MANUS index
MANUS2 = (Ppl+Ipl)/Mcl, # MANUS index with intermed. phalanx
IRI = Fgh / Fl, # Gluteal Index
FRI = Fsw / Fl, # Femoral Robustness
FEB = Fdw / Fl, # Femoral Epicondyle Breadth
CI = Tl / Fl, # Crural Index
TRI = Tmw / Tl, # Tibial Robustness Index
#ANR = Anl / Al, # Astragular Neck Robustness Index
#CAR = Cal / Cl, # Calcaneal Robustness Index
IRI = Il / Pel, # Illium Robustness Index
PR = Il / Isl, # Pelvic Index
PES = Pppl / Mtl, # PES INdex
PES2 = (Pppl+Pipl)/Mtl # PES with intermediate Phalanx
) %>%
mutate_at(vars(17:71), log) %>%
mutate_at(vars(16:93), scale2)
<<<<<<< HEAD
=======
✔ Reading from Master_Data.
✔ Range all data.
>>>>>>> 6b17dabeddd9bc3ae49ba2fd4f1e42240a536368
What does the missing data look like?
You can scroll through the table below to see
Percentage of Missing Data
| measurement |
count_missing |
percent_missing |
| Pdpw |
324 |
0.773 |
| Pipw |
278 |
0.663 |
| Pdpl |
277 |
0.661 |
| Dpw |
263 |
0.628 |
| Jl |
249 |
0.594 |
| Anl |
239 |
0.570 |
| Atw |
239 |
0.570 |
| Cal |
239 |
0.570 |
| Ccw |
238 |
0.568 |
| Csw |
238 |
0.568 |
| Ctl |
238 |
0.568 |
| Ctw |
238 |
0.568 |
| Al |
237 |
0.566 |
| Pppw |
230 |
0.549 |
| Skl |
228 |
0.544 |
| Mtw |
223 |
0.532 |
| Ipw |
217 |
0.518 |
| Dpl |
216 |
0.516 |
| PES2 |
194 |
0.463 |
| Pipl |
193 |
0.461 |
| Fbdw |
189 |
0.451 |
| Fbmw |
187 |
0.446 |
| Fgh |
187 |
0.446 |
| Fhd |
187 |
0.446 |
| HHRI |
185 |
0.442 |
| HHW |
185 |
0.442 |
| Hhl |
185 |
0.442 |
| Hhw |
185 |
0.442 |
| Ppw |
158 |
0.377 |
| Cl |
154 |
0.368 |
| Fbpw |
153 |
0.365 |
| MRI |
152 |
0.363 |
| Mcw |
152 |
0.363 |
| DI |
144 |
0.344 |
| Hdcw |
144 |
0.344 |
| Tdw |
141 |
0.337 |
| Tpw |
138 |
0.329 |
| Fbl |
137 |
0.327 |
| IRI |
137 |
0.327 |
| Isl |
137 |
0.327 |
| PR |
137 |
0.327 |
| Pel |
137 |
0.327 |
| Il |
136 |
0.325 |
| HPI |
135 |
0.322 |
| Hpw |
135 |
0.322 |
| Ipl |
117 |
0.279 |
| MANUS2 |
117 |
0.279 |
| PES |
95 |
0.227 |
| Pppl |
94 |
0.224 |
| Mtl |
88 |
0.210 |
| MANUS |
23 |
0.055 |
| Ppl |
23 |
0.055 |
| Mcl |
17 |
0.041 |
| PRTI |
17 |
0.041 |
| log_Mass |
10 |
0.024 |
| TRI |
3 |
0.007 |
| Tmw |
3 |
0.007 |
| CI |
2 |
0.005 |
| FEB |
2 |
0.005 |
| Fdw |
2 |
0.005 |
| IM |
2 |
0.005 |
| Tl |
2 |
0.005 |
| FRI |
1 |
0.002 |
| Fl |
1 |
0.002 |
| Fsw |
1 |
0.002 |
| SI |
1 |
0.002 |
| Sh |
1 |
0.002 |
| Sl |
1 |
0.002 |
| BI |
0 |
0.000 |
| HEB |
0 |
0.000 |
| HRI |
0 |
0.000 |
| Hdw |
0 |
0.000 |
| Hl |
0 |
0.000 |
| Hsw |
0 |
0.000 |
| OLI |
0 |
0.000 |
| Rl |
0 |
0.000 |
| Ul |
0 |
0.000 |
| Uol |
0 |
0.000 |
Binary Climb/No Climb Models
Preliminary data analysis, looping over all of the variables to see
which ones do a good job predicting the binary tree vs. no-tree
categorization
These are very preliminary, and the results will become more
nuanced and probably more confusing, but it can at least give us a sense
of which measurements are informative of climbing.
Here are all the model plots. On the y axis, 1 is TREE, 0 is NO TREE.
The x axis is the phenotype, mean centered on 0 and scaled to a standard
deviation of 1. All of the linear measurements are log transformed prior
to mean-centering. All the models include log_mass as a variable,
meaning that they are “size corrected”
representations of the effect of the phenotype on climbing. What we are
looking for is a slope that ranges across the whole y axis, meaning that
it touches the 1 and 0, and has a steep slope (either up or down). To
interpret, look at the 3rd plot, Hl. As Hl
increases, the probability of being TREE
increases, or, the longer the humerus, the more likely to climb!
Here are some standouts: (remember, these are log-transformed and
size-corrected effect sizes)
- humeral length (Hl)
- Olecranon length (Uol)
- Ulnar length (Ul)
- Radius length (Rl)
- Femur length (Fl)
- Proximal phalanx of the manus length (Ppl)
- Intermediate phalanx of the manus length (Ppl)
- Olecranon Length Index (OLI)
- MANUS and MANUS2 indices (#2 includes the intermediate phalanx)
- PES and PES2
for(i in fit_list2){
plots <- plot(conditional_effects(i), plot=F, points = T)[[1]]
print(plots + theme_bw())
}










































































<<<<<<< HEAD

First Look with Intraspecific Variation
Repeating above, but with Species as a group-level effect. There are
a total of 243 species, and 57 have more than one sample.
Plots
for(i in fit_list3){
plots <- plot(conditional_effects(i), plot=F, points = T)[[1]]
print(plots + theme_bw())
}











































































LS0tCnRpdGxlOiAiRmlyc3QgR2xpbXBzZSBvZiBEYXRhIgpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQKLS0tCgpMb2FkaW5nIHVwIHRoZSBkYXRhIGZvciBzb21lIHByZWxpbWluYXJ5IGFuYWx5c2VzIG9mIHRoZSBiaW5hcnkgY2xpbWIvbm8tY2xpbWIgY2F0ZWdvcmllcy4KCmBgYHtyIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQpwYWNtYW46OnBfbG9hZCh0aWR5dmVyc2UsIGdvb2dsZXNoZWV0czQsIGJybXMsIGNtZHN0YW5yLCBrYWJsZUV4dHJhKQoKb3B0aW9ucyhicm1zLmJhY2tlbmQgPSAiY21kc3RhbnIiKQoKc2NhbGUyIDwtIGZ1bmN0aW9uKHgsIG5hLnJtID0gVFJVRSkgKHggLSBtZWFuKHgsIG5hLnJtID0gVFJVRSkpIC8gc2QoeCwgbmEucm0pCmBgYAoKIyMjIyBMb2FkIGRhdGEKCllvdSBjYW4gc2VlIHRoZSBpbmRpY2VzIEkgYWRkIGluIHRoZSBjb2RlIGJlbG93LiBOb3RlIHRoYXQgdGhlIGluZGljZXMgYXJlIGFsbCBjYXBzLCBhbmQgdGhlIGxpbmVhciBtZWFzdXJlbWVudHMgaGF2ZSBsb3dlcmNhc2UgbGV0dGVycyBhZnRlciB0aGUgZmlyc3QuCgpgYGB7ciBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRhdCA8LSByZWFkX3NoZWV0KCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xLWVrbmh5WjFKTm5YcWhnMmtWaXl6Vm50QzhOR1p2SUxRWC1hUVFiMUp2ay9lZGl0I2dpZD0zMjUwMzY0NjAiLCBuYSA9IGMoIk5BIiwgIj8iLCAiIikpICU+JQogIHNlbGVjdCghTk9URVMpICU+JSAKIyBSZWNvZGUgT3JkaW5hbCBSYW5raW5ncwogIG11dGF0ZShMb2NfT3JkID0gY2FzZV93aGVuKExvY19tb2RlX09yZGluYWwgPT0gIkciIH4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NfbW9kZV9PcmRpbmFsID09ICJBIiB+IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jX21vZGVfT3JkaW5hbCA9PSAiU2MiIH4gMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NfbW9kZV9PcmRpbmFsID09ICJUIiB+IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jX21vZGVfT3JkaW5hbCA9PSAiSXMiIH4gNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NfbW9kZV9PcmRpbmFsID09ICJTZiIgfiA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY19tb2RlX09yZGluYWwgPT0gIlNzIiB+IDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BKSwKICAgICAgICAgTG9jX09yZCA9IGFzLm9yZGVyZWQoTG9jX09yZCksCiAgICAgICAgIExvY19iaW4gPSBjYXNlX3doZW4oTG9jX21vZGVfQmluZGFyeSA9PSAiR3JvdW5kIiB+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jX21vZGVfQmluZGFyeSA9PSAiVHJlZSIgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgIyBMb2NfYmluID0gYXMuZmFjdG9yKExvY19iaW4pLAogICAgICAgICBMb2NfbW9kZV9DYXRlZ29yaWNhbCA9IGFzLmZhY3RvcihMb2NfbW9kZV9DYXRlZ29yaWNhbCksCiAgICAgICAgIGxvZ19NYXNzID0gbG9nKE1hc3NfZ3JhbXMpKSAlPiUgCiAgICByZWxvY2F0ZShMb2NfYmluLCAuYWZ0ZXIgPSBMb2NfbW9kZV9CaW5kYXJ5KSAlPiUgCiAgcmVsb2NhdGUoTG9jX09yZCwgLmFmdGVyID0gTG9jX21vZGVfT3JkaW5hbCkgJT4lIAogIHJlbG9jYXRlKGxvZ19NYXNzLCAuYmVmb3JlID0gU2tsKSAlPiUgCiMjIyMjIyMjIyMjIyMjIyMjCiNDYWxjdWxhdGUgSW5kaWNlcyEKIyMjIyMjIyMjIyMjIyMjIyMKICBtdXRhdGUoU0kgPSBTaCAvIFNsLCAgICAgICAgICAgICAjIFNjYXB1bGFyIEluZGV4CiAgICAgICAgIEhSSSA9IEhzdyAvIEhsLCAgICAgICAgICAgIyBIdW1lcmFsIFJvYnVzdG5lc3MgSW5kZXgKICAgICAgICAgSFBJID0gSHB3IC8gSGwsICAgICAgICAgICAjIEh1bWVyYWwgUHJveGltYWwgSW5kZXgKICAgICAgICAgSEVCID0gSGR3IC8gSGwsICAgICAgICAgICAjIEh1bWVyYWwgRXBpY29uZHlsZSBCcmVhZHRoCiAgICAgICAgIEhIUkkgPSBIaGwgLyBIbCwgICAgICAgICAgIyBIdW1lcmFsIEhlYWQgUm9idXN0bmVzcyBJbmRleAogICAgICAgICBISFcgPSBIaHcgLyBIaGwsICAgICAgICAgICMgSHVtZXJhbCBIZWFkIFNoYXBlIEluZGV4CiAgICAgICAgIERJID0gSGRjdyAvIEhzdywgICAgICAgICAgIyBEZWx0b3BlY3RvcmFsIENyZXN0IEluZGV4CiAgICAgICAgIE9MSSA9IFVvbCAvIFVsLCAgICAgICAgICAgIyBPbGVjcmFub24gUHJvY2VzcyBMZW5ndGggSW5kZXgKICAgICAgICAgQkkgPSBSbCAvIEhsLCAgICAgICAgICAgICAjIEJyYWNoaWFsIEluZGV4CiAgICAgICAgIElNID0gKEhsK1VsKS8oRmwrVGwpLCAgICAgIyBJbnRlcm1lbWJyYWwgSW5kZXgKICAgICAgICAgUFJUSSA9IE1jbC8oSGwrUmwpLCAgICAgICAjIFBhbG0gUm9idXN0bmVzcyBJbmRleAogICAgICAgICBNUkkgPSBNY3cgLyBNY2wsICAgICAgICAgICMgTWV0YWNhcnBhbCBSb2J1c3RuZXNzCiAgICAgICAgIE1BTlVTID0gUHBsIC8gTWNsLCAgICAgICAgIyBNQU5VUyBpbmRleAogICAgICAgICBNQU5VUzIgPSAoUHBsK0lwbCkvTWNsLCAgICMgTUFOVVMgaW5kZXggd2l0aCBpbnRlcm1lZC4gcGhhbGFueAogICAgICAgICBJUkkgPSBGZ2ggLyBGbCwgICAgICAgICAgICMgR2x1dGVhbCBJbmRleAogICAgICAgICBGUkkgPSBGc3cgLyBGbCwgICAgICAgICAgICMgRmVtb3JhbCBSb2J1c3RuZXNzCiAgICAgICAgIEZFQiA9IEZkdyAvIEZsLCAgICAgICAgICAgIyBGZW1vcmFsIEVwaWNvbmR5bGUgQnJlYWR0aAogICAgICAgICBDSSA9IFRsIC8gRmwsICAgICAgICAgICAgICMgQ3J1cmFsIEluZGV4CiAgICAgICAgIFRSSSA9IFRtdyAvIFRsLCAgICAgICAgICAgIyBUaWJpYWwgUm9idXN0bmVzcyBJbmRleAogICAgICAgICAjQU5SID0gQW5sIC8gQWwsICAgICAgICAgICMgQXN0cmFndWxhciBOZWNrIFJvYnVzdG5lc3MgSW5kZXgKICAgICAgICAgI0NBUiA9IENhbCAvIENsLCAgICAgICAgICAjIENhbGNhbmVhbCBSb2J1c3RuZXNzIEluZGV4CiAgICAgICAgIElSSSA9IElsIC8gUGVsLCAgICAgICAgICAgIyBJbGxpdW0gUm9idXN0bmVzcyBJbmRleAogICAgICAgICBQUiA9IElsIC8gSXNsLCAgICAgICAgICAgICMgUGVsdmljIEluZGV4CiAgICAgICAgIFBFUyA9IFBwcGwgLyBNdGwsICAgICAgICAgIyBQRVMgSU5kZXgKICAgICAgICAgUEVTMiA9IChQcHBsK1BpcGwpL010bCAgICAjIFBFUyB3aXRoIGludGVybWVkaWF0ZSBQaGFsYW54CiAgICAgICAgICkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKDE3OjcxKSwgbG9nKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoMTY6OTMpLCBzY2FsZTIpCmBgYAoKV2hhdCBkb2VzIHRoZSBtaXNzaW5nIGRhdGEgbG9vayBsaWtlP1wKWW91IGNhbiBzY3JvbGwgdGhyb3VnaCB0aGUgdGFibGUgYmVsb3cgdG8gc2VlCgpgYGB7ciAgZWNobyA9IEZBTFNFfQpuID0gbnJvdyhkYXQpCgpkYXQgJT4lIHNlbGVjdCgxNjo5MykgJT4lIAogIHN1bW1hcmlzZV9hbGwoKH4gc3VtKGlzLm5hKC4pKSkpICU+JSAKICBtdXRhdGVfaWYoaXMuZG91YmxlLCB+IG4gLSAuKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAibWVhc3VyZW1lbnQiLCB2YWx1ZXNfdG8gPSAiY291bnRfbWlzc2luZyIpICU+JSBhcnJhbmdlKGRlc2MoY291bnRfbWlzc2luZyksIG1lYXN1cmVtZW50KSAlPiUgCiAgbXV0YXRlKHBlcmNlbnRfbWlzc2luZyA9IHJvdW5kKGNvdW50X21pc3NpbmcgLyBuLCBkaWdpdHMgPSAzKSkgJT4lIAogIGtibChjYXB0aW9uID0gIlBlcmNlbnRhZ2Ugb2YgTWlzc2luZyBEYXRhIikgJT4lIAogIGthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IEYsIGh0bWxfZm9udCA9ICJDYW1icmlhIikgJT4lIAogIHNjcm9sbF9ib3god2lkdGggPSAiNTAwcHgiLCBoZWlnaHQgPSAiMjAwcHgiKQpgYGAKCiMjIyMgQmluYXJ5IENsaW1iL05vIENsaW1iIE1vZGVscwoKUHJlbGltaW5hcnkgZGF0YSBhbmFseXNpcywgbG9vcGluZyBvdmVyIGFsbCBvZiB0aGUgdmFyaWFibGVzIHRvIHNlZSB3aGljaCBvbmVzIGRvIGEgZ29vZCBqb2IgcHJlZGljdGluZyB0aGUgYmluYXJ5IHRyZWUgdnMuIG5vLXRyZWUgY2F0ZWdvcml6YXRpb24KClRoZXNlIGFyZSBbdmVyeV17LnVuZGVybGluZX0gcHJlbGltaW5hcnksIGFuZCB0aGUgcmVzdWx0cyB3aWxsIGJlY29tZSBtb3JlIG51YW5jZWQgYW5kIHByb2JhYmx5IG1vcmUgY29uZnVzaW5nLCBidXQgaXQgY2FuIGF0IGxlYXN0IGdpdmUgdXMgYSBzZW5zZSBvZiB3aGljaCBtZWFzdXJlbWVudHMgYXJlIGluZm9ybWF0aXZlIG9mIGNsaW1iaW5nLgoKYGBge3IgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlID0gRkFMU0UsIGNhY2hlPVRSVUV9CiNpbml0aWFsIGZpdAptbSA8LSBicm0oCiAgI0xvY19iaW4gfiBTbCArIGxvZ19NYXNzICsgKDEgfCBHZW51c19zcGVjaWVzKSwKICBMb2NfYmluIH4gU2wgKyBsb2dfTWFzcywKICAgICAgICAgICBmYW1pbHkgPSBiZXJub3VsbGkoKSwKICAgICAgICAgICBkYXRhID0gZGF0LCByZWZyZXNoID0gMCkKYGBgCgpgYGB7ciBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGUgPSBGQUxTRSwgY2FjaGU9VFJVRX0KCnZhcmlzIDwtIGNvbG5hbWVzKGRhdClbMTk6OTNdCgpmaXRfbGlzdCA8LSB2ZWN0b3IobW9kZSA9Imxpc3QiLCBsZW5ndGggPSA3NykKCmZvcihpIGluIHZhcmlzKXsKICBmaXRfbGlzdFtbaV1dPC0gdXBkYXRlKG1tLAogICAgICAgICAgICAgICAgICAgICAgICAgI2Zvcm11bGE9KHBhc3RlMCgiTG9jX2JpbiB+IiwgaSwgIitsb2dfTWFzcysoMXxHZW51c19zcGVjaWVzKSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm11bGE9KHBhc3RlMCgiTG9jX2JpbiB+IiwgaSwgIitsb2dfTWFzcyIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IGJlcm5vdWxsaSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3ZGF0YT1kYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gMAogICAgICAgICAgICAgICAgICAgICAgICAgKSAKfQoKZml0X2xpc3QyIDwtIGZpdF9saXN0Wzc4OjE1Ml0Kcm0oZml0X2xpc3QpCmBgYAoKSGVyZSBhcmUgYWxsIHRoZSBtb2RlbCBwbG90cy4gT24gdGhlIHkgYXhpcywgMSBpcyBUUkVFLCAwIGlzIE5PIFRSRUUuIFRoZSB4IGF4aXMgaXMgdGhlIHBoZW5vdHlwZSwgbWVhbiBjZW50ZXJlZCBvbiAwIGFuZCBzY2FsZWQgdG8gYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMS4gQWxsIG9mIHRoZSBsaW5lYXIgbWVhc3VyZW1lbnRzIGFyZSBsb2cgdHJhbnNmb3JtZWQgcHJpb3IgdG8gbWVhbi1jZW50ZXJpbmcuIEFsbCB0aGUgbW9kZWxzIGluY2x1ZGUgbG9nX21hc3MgYXMgYSB2YXJpYWJsZSwgbWVhbmluZyB0aGF0IHRoZXkgYXJlICIqKipzaXplIGNvcnJlY3RlZCoqKiIgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBlZmZlY3Qgb2YgdGhlIHBoZW5vdHlwZSBvbiBjbGltYmluZy4gV2hhdCB3ZSBhcmUgbG9va2luZyBmb3IgaXMgYSBzbG9wZSB0aGF0IHJhbmdlcyBhY3Jvc3MgdGhlIHdob2xlIHkgYXhpcywgbWVhbmluZyB0aGF0IGl0IHRvdWNoZXMgdGhlIDEgYW5kIDAsIGFuZCBoYXMgYSBzdGVlcCBzbG9wZSAoZWl0aGVyIHVwIG9yIGRvd24pLiBUbyBpbnRlcnByZXQsIGxvb2sgYXQgdGhlIDNyZCBwbG90LCAqKipIbCoqKi4gQXMgSGwgaW5jcmVhc2VzLCB0aGUgcHJvYmFiaWxpdHkgb2YgYmVpbmcgKioqVFJFRSoqKiBpbmNyZWFzZXMsIG9yLCB0aGUgbG9uZ2VyIHRoZSBodW1lcnVzLCB0aGUgbW9yZSBsaWtlbHkgdG8gY2xpbWIhCgpIZXJlIGFyZSBzb21lIHN0YW5kb3V0czogKCpyZW1lbWJlciwgdGhlc2UgYXJlIGxvZy10cmFuc2Zvcm1lZCBhbmQgc2l6ZS1jb3JyZWN0ZWQgZWZmZWN0IHNpemVzKikKCi0gICBodW1lcmFsIGxlbmd0aCAoSGwpXAotICAgT2xlY3Jhbm9uIGxlbmd0aCAoVW9sKVwKLSAgIFVsbmFyIGxlbmd0aCAoVWwpXAotICAgUmFkaXVzIGxlbmd0aCAoUmwpXAotICAgRmVtdXIgbGVuZ3RoIChGbClcCi0gICBQcm94aW1hbCBwaGFsYW54IG9mIHRoZSBtYW51cyBsZW5ndGggKFBwbClcCi0gICBJbnRlcm1lZGlhdGUgcGhhbGFueCBvZiB0aGUgbWFudXMgbGVuZ3RoIChQcGwpXAotICAgT2xlY3Jhbm9uIExlbmd0aCBJbmRleCAoT0xJKVwKLSAgIE1BTlVTIGFuZCBNQU5VUzIgaW5kaWNlcyAoIzIgaW5jbHVkZXMgdGhlIGludGVybWVkaWF0ZSBwaGFsYW54KQotICAgUEVTIGFuZCBQRVMyCgpgYGB7ciBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPVRSVUV9CmZvcihpIGluIGZpdF9saXN0Mil7CiBwbG90cyA8LSBwbG90KGNvbmRpdGlvbmFsX2VmZmVjdHMoaSksIHBsb3Q9RiwgcG9pbnRzID0gVClbWzFdXQogcHJpbnQocGxvdHMgKyB0aGVtZV9idygpKQp9CgpgYGAKCgojIyBGaXJzdCBMb29rIHdpdGggSW50cmFzcGVjaWZpYyBWYXJpYXRpb24KCmBgYHtyIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQojZGF0ICU+JSBncm91cF9ieShHZW51c19zcGVjaWVzKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQpgYGAKClJlcGVhdGluZyBhYm92ZSwgYnV0IHdpdGggU3BlY2llcyBhcyBhIGdyb3VwLWxldmVsIGVmZmVjdC4gClRoZXJlIGFyZSBhIHRvdGFsIG9mIDI0MyBzcGVjaWVzLCBhbmQgNTcgaGF2ZSBtb3JlIHRoYW4gb25lIHNhbXBsZS4gCgpgYGB7ciBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGUgPSBGQUxTRSwgY2FjaGU9VFJVRX0KcHJpb3JzID0gYyhwcmlvcihub3JtYWwoMCwgMS41KSwgY2xhc3MgPSBJbnRlcmNlcHQpLAogICAgICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEuNSksIGNsYXNzID0gYiksCiAgICAgICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMS41KSwgY2xhc3MgPSBzZCkpCiNpbml0aWFsIGZpdAptbTIgPC0gYnJtKAogIExvY19iaW4gfiBTbCArIGxvZ19NYXNzICsgKDEgfCBHZW51c19zcGVjaWVzKSwKICAjTG9jX2JpbiB+IFNsICsgbG9nX01hc3MsCiAgZmFtaWx5ID0gYmVybm91bGxpKCksCiAgcHJpb3IgPSBwcmlvcnMsCiAgZGF0YSA9IGRhdCwgY29yZXMgPSA0LCByZWZyZXNoID0gMCwgc2VlZCA9IDEyMzQpCgp2YXJpcyA8LSBjb2xuYW1lcyhkYXQpWzE5OjkzXQoKZml0X2xpc3QgPC0gdmVjdG9yKG1vZGUgPSJsaXN0IiwgbGVuZ3RoID0gNzcpCgpmb3IoaSBpbiB2YXJpcyl7CiAgZml0X2xpc3RbW2ldXTwtIHVwZGF0ZShtbSwKICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm11bGE9KHBhc3RlMCgiTG9jX2JpbiB+IiwgaSwgIitsb2dfTWFzcysoMXxHZW51c19zcGVjaWVzKSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICNmb3JtdWxhPShwYXN0ZTAoIkxvY19iaW4gfiIsIGksICIrbG9nX01hc3MiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBiZXJub3VsbGkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2RhdGE9ZGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IHByaW9ycywKICAgICAgICAgICAgICAgICAgICAgICAgIHNlZWQgPSAxMjM0CiAgICAgICAgICAgICAgICAgICAgICAgICApIAp9CgpmaXRfbGlzdDMgPC0gZml0X2xpc3RbNzg6MTUyXQpybShmaXRfbGlzdCkKYGBgCgpQbG90cwpgYGB7ciBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPVRSVUV9CmZvcihpIGluIGZpdF9saXN0Myl7CiBwbG90cyA8LSBwbG90KGNvbmRpdGlvbmFsX2VmZmVjdHMoaSksIHBsb3Q9RiwgcG9pbnRzID0gVClbWzFdXQogcHJpbnQocGxvdHMgKyB0aGVtZV9idygpKQp9CmBgYAoK
=======

LS0tCnRpdGxlOiAiRmlyc3QgR2xpbXBzZSBvZiBEYXRhIgpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQKLS0tCgpMb2FkaW5nIHVwIHRoZSBkYXRhIGZvciBzb21lIHByZWxpbWluYXJ5IGFuYWx5c2VzIG9mIHRoZSBiaW5hcnkgY2xpbWIvbm8tY2xpbWIgY2F0ZWdvcmllcy4KCmBgYHtyIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQpwYWNtYW46OnBfbG9hZCh0aWR5dmVyc2UsIGdvb2dsZXNoZWV0czQsIGJybXMsIGNtZHN0YW5yLCBrYWJsZUV4dHJhKQpvcHRpb25zKGJybXMuYmFja2VuZCA9ICJjbWRzdGFuciIpCgpzY2FsZTIgPC0gZnVuY3Rpb24oeCwgbmEucm0gPSBUUlVFKSAoeCAtIG1lYW4oeCwgbmEucm0gPSBUUlVFKSkgLyBzZCh4LCBuYS5ybSkKYGBgCgojIyMjIExvYWQgZGF0YQoKWW91IGNhbiBzZWUgdGhlIGluZGljZXMgSSBhZGQgaW4gdGhlIGNvZGUgYmVsb3cuIE5vdGUgdGhhdCB0aGUgaW5kaWNlcyBhcmUgYWxsIGNhcHMsIGFuZCB0aGUgbGluZWFyIG1lYXN1cmVtZW50cyBoYXZlIGxvd2VyY2FzZSBsZXR0ZXJzIGFmdGVyIHRoZSBmaXJzdC4KCmBgYHtyIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRX0KZGF0IDwtIHJlYWRfc2hlZXQoImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzEtZWtuaHlaMUpOblhxaGcya1ZpeXpWbnRDOE5HWnZJTFFYLWFRUWIxSnZrL2VkaXQjZ2lkPTMyNTAzNjQ2MCIsIG5hID0gYygiTkEiLCAiPyIsICIiKSkgJT4lCiAgc2VsZWN0KCFOT1RFUykgJT4lIAojIFJlY29kZSBPcmRpbmFsIFJhbmtpbmdzCiAgbXV0YXRlKExvY19PcmQgPSBjYXNlX3doZW4oTG9jX21vZGVfT3JkaW5hbCA9PSAiRyIgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY19tb2RlX09yZGluYWwgPT0gIkEiIH4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NfbW9kZV9PcmRpbmFsID09ICJTYyIgfiAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY19tb2RlX09yZGluYWwgPT0gIlQiIH4gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NfbW9kZV9PcmRpbmFsID09ICJJcyIgfiA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY19tb2RlX09yZGluYWwgPT0gIlNmIiB+IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jX21vZGVfT3JkaW5hbCA9PSAiU3MiIH4gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkEpLAogICAgICAgICBMb2NfT3JkID0gYXMub3JkZXJlZChMb2NfT3JkKSwKICAgICAgICAgTG9jX2JpbiA9IGNhc2Vfd2hlbihMb2NfbW9kZV9CaW5kYXJ5ID09ICJHcm91bmQiIH4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NfbW9kZV9CaW5kYXJ5ID09ICJUcmVlIiB+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAjIExvY19iaW4gPSBhcy5mYWN0b3IoTG9jX2JpbiksCiAgICAgICAgIExvY19tb2RlX0NhdGVnb3JpY2FsID0gYXMuZmFjdG9yKExvY19tb2RlX0NhdGVnb3JpY2FsKSwKICAgICAgICAgbG9nX01hc3MgPSBsb2coTWFzc19ncmFtcykpICU+JSAKICAgIHJlbG9jYXRlKExvY19iaW4sIC5hZnRlciA9IExvY19tb2RlX0JpbmRhcnkpICU+JSAKICByZWxvY2F0ZShMb2NfT3JkLCAuYWZ0ZXIgPSBMb2NfbW9kZV9PcmRpbmFsKSAlPiUgCiAgcmVsb2NhdGUobG9nX01hc3MsIC5iZWZvcmUgPSBTa2wpICU+JSAKIyMjIyMjIyMjIyMjIyMjIyMKI0NhbGN1bGF0ZSBJbmRpY2VzIQojIyMjIyMjIyMjIyMjIyMjIwogIG11dGF0ZShTSSA9IFNoIC8gU2wsICAgICAgICAgICAgICMgU2NhcHVsYXIgSW5kZXgKICAgICAgICAgSFJJID0gSHN3IC8gSGwsICAgICAgICAgICAjIEh1bWVyYWwgUm9idXN0bmVzcyBJbmRleAogICAgICAgICBIUEkgPSBIcHcgLyBIbCwgICAgICAgICAgICMgSHVtZXJhbCBQcm94aW1hbCBJbmRleAogICAgICAgICBIRUIgPSBIZHcgLyBIbCwgICAgICAgICAgICMgSHVtZXJhbCBFcGljb25keWxlIEJyZWFkdGgKICAgICAgICAgSEhSSSA9IEhobCAvIEhsLCAgICAgICAgICAjIEh1bWVyYWwgSGVhZCBSb2J1c3RuZXNzIEluZGV4CiAgICAgICAgIEhIVyA9IEhodyAvIEhobCwgICAgICAgICAgIyBIdW1lcmFsIEhlYWQgU2hhcGUgSW5kZXgKICAgICAgICAgREkgPSBIZGN3IC8gSHN3LCAgICAgICAgICAjIERlbHRvcGVjdG9yYWwgQ3Jlc3QgSW5kZXgKICAgICAgICAgT0xJID0gVW9sIC8gVWwsICAgICAgICAgICAjIE9sZWNyYW5vbiBQcm9jZXNzIExlbmd0aCBJbmRleAogICAgICAgICBCSSA9IFJsIC8gSGwsICAgICAgICAgICAgICMgQnJhY2hpYWwgSW5kZXgKICAgICAgICAgSU0gPSAoSGwrVWwpLyhGbCtUbCksICAgICAjIEludGVybWVtYnJhbCBJbmRleAogICAgICAgICBQUlRJID0gTWNsLyhIbCtSbCksICAgICAgICMgUGFsbSBSb2J1c3RuZXNzIEluZGV4CiAgICAgICAgIE1SSSA9IE1jdyAvIE1jbCwgICAgICAgICAgIyBNZXRhY2FycGFsIFJvYnVzdG5lc3MKICAgICAgICAgTUFOVVMgPSBQcGwgLyBNY2wsICAgICAgICAjIE1BTlVTIGluZGV4CiAgICAgICAgIE1BTlVTMiA9IChQcGwrSXBsKS9NY2wsICAgIyBNQU5VUyBpbmRleCB3aXRoIGludGVybWVkLiBwaGFsYW54CiAgICAgICAgIElSSSA9IEZnaCAvIEZsLCAgICAgICAgICAgIyBHbHV0ZWFsIEluZGV4CiAgICAgICAgIEZSSSA9IEZzdyAvIEZsLCAgICAgICAgICAgIyBGZW1vcmFsIFJvYnVzdG5lc3MKICAgICAgICAgRkVCID0gRmR3IC8gRmwsICAgICAgICAgICAjIEZlbW9yYWwgRXBpY29uZHlsZSBCcmVhZHRoCiAgICAgICAgIENJID0gVGwgLyBGbCwgICAgICAgICAgICAgIyBDcnVyYWwgSW5kZXgKICAgICAgICAgVFJJID0gVG13IC8gVGwsICAgICAgICAgICAjIFRpYmlhbCBSb2J1c3RuZXNzIEluZGV4CiAgICAgICAgICNBTlIgPSBBbmwgLyBBbCwgICAgICAgICAgIyBBc3RyYWd1bGFyIE5lY2sgUm9idXN0bmVzcyBJbmRleAogICAgICAgICAjQ0FSID0gQ2FsIC8gQ2wsICAgICAgICAgICMgQ2FsY2FuZWFsIFJvYnVzdG5lc3MgSW5kZXgKICAgICAgICAgSVJJID0gSWwgLyBQZWwsICAgICAgICAgICAjIElsbGl1bSBSb2J1c3RuZXNzIEluZGV4CiAgICAgICAgIFBSID0gSWwgLyBJc2wsICAgICAgICAgICAgIyBQZWx2aWMgSW5kZXgKICAgICAgICAgUEVTID0gUHBwbCAvIE10bCwgICAgICAgICAjIFBFUyBJTmRleAogICAgICAgICBQRVMyID0gKFBwcGwrUGlwbCkvTXRsICAgICMgUEVTIHdpdGggaW50ZXJtZWRpYXRlIFBoYWxhbngKICAgICAgICAgKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoMTc6NzEpLCBsb2cpICU+JSAKICBtdXRhdGVfYXQodmFycygxNjo5MyksIHNjYWxlMikKYGBgCgpXaGF0IGRvZXMgdGhlIG1pc3NpbmcgZGF0YSBsb29rIGxpa2U/XApZb3UgY2FuIHNjcm9sbCB0aHJvdWdoIHRoZSB0YWJsZSBiZWxvdyB0byBzZWUKCmBgYHtyICBlY2hvID0gRkFMU0V9Cm4gPSBucm93KGRhdCkKCmRhdCAlPiUgc2VsZWN0KDE2OjkzKSAlPiUgCiAgc3VtbWFyaXNlX2FsbCgofiBzdW0oaXMubmEoLikpKSkgJT4lIAogIG11dGF0ZV9pZihpcy5kb3VibGUsIH4gbiAtIC4pICU+JSAKICBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLCBuYW1lc190byA9ICJtZWFzdXJlbWVudCIsIHZhbHVlc190byA9ICJjb3VudF9taXNzaW5nIikgJT4lIGFycmFuZ2UoZGVzYyhjb3VudF9taXNzaW5nKSwgbWVhc3VyZW1lbnQpICU+JSAKICBtdXRhdGUocGVyY2VudF9taXNzaW5nID0gcm91bmQoY291bnRfbWlzc2luZyAvIG4sIGRpZ2l0cyA9IDMpKSAlPiUgCiAga2JsKGNhcHRpb24gPSAiUGVyY2VudGFnZSBvZiBNaXNzaW5nIERhdGEiKSAlPiUgCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRiwgaHRtbF9mb250ID0gIkNhbWJyaWEiKSAlPiUgCiAgc2Nyb2xsX2JveCh3aWR0aCA9ICI1MDBweCIsIGhlaWdodCA9ICIyMDBweCIpCmBgYAoKIyMjIyBCaW5hcnkgQ2xpbWIvTm8gQ2xpbWIgTW9kZWxzCgpQcmVsaW1pbmFyeSBkYXRhIGFuYWx5c2lzLCBsb29waW5nIG92ZXIgYWxsIG9mIHRoZSB2YXJpYWJsZXMgdG8gc2VlIHdoaWNoIG9uZXMgZG8gYSBnb29kIGpvYiBwcmVkaWN0aW5nIHRoZSBiaW5hcnkgdHJlZSB2cy4gbm8tdHJlZSBjYXRlZ29yaXphdGlvbgoKVGhlc2UgYXJlIFt2ZXJ5XXsudW5kZXJsaW5lfSBwcmVsaW1pbmFyeSwgYW5kIHRoZSByZXN1bHRzIHdpbGwgYmVjb21lIG1vcmUgbnVhbmNlZCBhbmQgcHJvYmFibHkgbW9yZSBjb25mdXNpbmcsIGJ1dCBpdCBjYW4gYXQgbGVhc3QgZ2l2ZSB1cyBhIHNlbnNlIG9mIHdoaWNoIG1lYXN1cmVtZW50cyBhcmUgaW5mb3JtYXRpdmUgb2YgY2xpbWJpbmcuCgpgYGB7ciBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGUgPSBGQUxTRSwgY2FjaGU9VFJVRX0KI2luaXRpYWwgZml0Cm1tIDwtIGJybSgKICAjTG9jX2JpbiB+IFNsICsgbG9nX01hc3MgKyAoMSB8IEdlbnVzX3NwZWNpZXMpLAogIExvY19iaW4gfiBTbCArIGxvZ19NYXNzLAogICAgICAgICAgIGZhbWlseSA9IGJlcm5vdWxsaSgpLAogICAgICAgICAgIGRhdGEgPSBkYXQsIHJlZnJlc2ggPSAwKQpgYGAKCmBgYHtyIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZSA9IEZBTFNFLCBjYWNoZT1UUlVFfQoKdmFyaXMgPC0gY29sbmFtZXMoZGF0KVsxOTo5M10KCmZpdF9saXN0IDwtIHZlY3Rvcihtb2RlID0ibGlzdCIsIGxlbmd0aCA9IDc3KQoKZm9yKGkgaW4gdmFyaXMpewogIGZpdF9saXN0W1tpXV08LSB1cGRhdGUobW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAjZm9ybXVsYT0ocGFzdGUwKCJMb2NfYmluIH4iLCBpLCAiK2xvZ19NYXNzKygxfEdlbnVzX3NwZWNpZXMpIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXVsYT0ocGFzdGUwKCJMb2NfYmluIH4iLCBpLCAiK2xvZ19NYXNzIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gYmVybm91bGxpKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXdkYXRhPWRhdCwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggPSAwCiAgICAgICAgICAgICAgICAgICAgICAgICApIAp9CgpmaXRfbGlzdDIgPC0gZml0X2xpc3RbNzg6MTUyXQpybShmaXRfbGlzdCkKYGBgCgpIZXJlIGFyZSBhbGwgdGhlIG1vZGVsIHBsb3RzLiBPbiB0aGUgeSBheGlzLCAxIGlzIFRSRUUsIDAgaXMgTk8gVFJFRS4gVGhlIHggYXhpcyBpcyB0aGUgcGhlbm90eXBlLCBtZWFuIGNlbnRlcmVkIG9uIDAgYW5kIHNjYWxlZCB0byBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxLiBBbGwgb2YgdGhlIGxpbmVhciBtZWFzdXJlbWVudHMgYXJlIGxvZyB0cmFuc2Zvcm1lZCBwcmlvciB0byBtZWFuLWNlbnRlcmluZy4gQWxsIHRoZSBtb2RlbHMgaW5jbHVkZSBsb2dfbWFzcyBhcyBhIHZhcmlhYmxlLCBtZWFuaW5nIHRoYXQgdGhleSBhcmUgIioqKnNpemUgY29ycmVjdGVkKioqIiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGVmZmVjdCBvZiB0aGUgcGhlbm90eXBlIG9uIGNsaW1iaW5nLiBXaGF0IHdlIGFyZSBsb29raW5nIGZvciBpcyBhIHNsb3BlIHRoYXQgcmFuZ2VzIGFjcm9zcyB0aGUgd2hvbGUgeSBheGlzLCBtZWFuaW5nIHRoYXQgaXQgdG91Y2hlcyB0aGUgMSBhbmQgMCwgYW5kIGhhcyBhIHN0ZWVwIHNsb3BlIChlaXRoZXIgdXAgb3IgZG93bikuIFRvIGludGVycHJldCwgbG9vayBhdCB0aGUgM3JkIHBsb3QsICoqKkhsKioqLiBBcyBIbCBpbmNyZWFzZXMsIHRoZSBwcm9iYWJpbGl0eSBvZiBiZWluZyAqKipUUkVFKioqIGluY3JlYXNlcywgb3IsIHRoZSBsb25nZXIgdGhlIGh1bWVydXMsIHRoZSBtb3JlIGxpa2VseSB0byBjbGltYiEKCkhlcmUgYXJlIHNvbWUgc3RhbmRvdXRzOiAoKnJlbWVtYmVyLCB0aGVzZSBhcmUgbG9nLXRyYW5zZm9ybWVkIGFuZCBzaXplLWNvcnJlY3RlZCBlZmZlY3Qgc2l6ZXMqKQoKLSAgIGh1bWVyYWwgbGVuZ3RoIChIbClcCi0gICBPbGVjcmFub24gbGVuZ3RoIChVb2wpXAotICAgVWxuYXIgbGVuZ3RoIChVbClcCi0gICBSYWRpdXMgbGVuZ3RoIChSbClcCi0gICBGZW11ciBsZW5ndGggKEZsKVwKLSAgIFByb3hpbWFsIHBoYWxhbnggb2YgdGhlIG1hbnVzIGxlbmd0aCAoUHBsKVwKLSAgIEludGVybWVkaWF0ZSBwaGFsYW54IG9mIHRoZSBtYW51cyBsZW5ndGggKFBwbClcCi0gICBPbGVjcmFub24gTGVuZ3RoIEluZGV4IChPTEkpXAotICAgTUFOVVMgYW5kIE1BTlVTMiBpbmRpY2VzICgjMiBpbmNsdWRlcyB0aGUgaW50ZXJtZWRpYXRlIHBoYWxhbngpCi0gICBQRVMgYW5kIFBFUzIKCmBgYHtyIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgY2FjaGU9VFJVRX0KZm9yKGkgaW4gZml0X2xpc3QyKXsKIHBsb3RzIDwtIHBsb3QoY29uZGl0aW9uYWxfZWZmZWN0cyhpKSwgcGxvdD1GLCBwb2ludHMgPSBUKVtbMV1dCiBwcmludChwbG90cyArIHRoZW1lX2J3KCkpCn0KCmBgYAo=
>>>>>>> 6b17dabeddd9bc3ae49ba2fd4f1e42240a536368